In [189]:
import numpy as np 
import csv
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
sns.set(color_codes = True)
from data import *
from scipy import stats

DATA = Data('../data/movie_metadata.csv')

Ce notebook a pour objectif d'illustrer la partie du cours sur la régression linéaire. Les commentaires associés à chaque figure sont ceux que l'on a pu faire en séance.

Fonctions de coût

In [190]:
score = DATA.get_imdb_score()
budget = DATA.get_budget()
year = DATA.get_title_year()
voted_user = DATA.get_num_voted_users()
In [192]:
plt.plot(voted_user[:29], score[:29], 'o')
plt.xlabel('Nombre d''utilisateurs qui ont voté')
plt.ylabel('Score')
plt.show()
In [193]:
from sklearn import linear_model
from sklearn.metrics import mean_squared_error, r2_score
regr = linear_model.LinearRegression()
regr.fit(voted_user[:29].reshape(-1, 1), score[:29].reshape(-1, 1))
Out[193]:
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)

La régression réalisée avec la fonction 'linear_model.LinearRegression.fit()' utilise la fonction de coût quadratique.

In [194]:
X = np.arange(voted_user[:29].min(), voted_user[:29].max())[:, np.newaxis]
Y = regr.predict(X)
In [195]:
plt.plot(voted_user[:29], score[:29], 'o')
plt.plot(X, Y, 'navy')
plt.xlabel('Nombre d''utilisateurs qui ont voté')
plt.ylabel('Score')
plt.show()
In [196]:
a = regr.coef_[0]
b = np.mean(Y) - a*np.mean(X)
print('Equation de la droite : y = '+str(a[0])+' x + ' + str(b[0]))
Equation de la droite : y = 7.79326294325e-07 x + 7.80541485836

Coût quadratique

In [197]:
quadr_cost = np.sum( ( a*voted_user[:29] + b - score[:29])**2 )
print('Coût absolu : ' + str(quadr_cost))
Coût absolu : 1.44859592103

Vérifions que la droite trouvée permet de minimiser les différents coûts en faisant varier légèrement les valeurs des paramètres a et b.

In [198]:
b_tilde = [0.8, 0.9, 1., 1.1, 1.2]*b
a_tilde = [0.8, 0.9, 1., 1.1, 1.2]*a


for i in range(len(a_tilde)):
    for j in range(len(b_tilde)):
        y = a_tilde[i]*voted_user[:29] + b_tilde[j]
        print('Coût quadratique : ' + str( np.sum( ( y - score[:29])**2 )) + '  pour a_tilde = ' + str(a_tilde[i])+ ' et b_tilde = ' + str(b_tilde[j]))

print('\n')
for i in range(len(a_tilde)):
    for j in range(len(b_tilde)):
        y = a_tilde[i]*voted_user[:29] + b_tilde[j]
        print('Coût absolu : ' + str( np.sum( np.abs( y - score[:29]) )) + '  pour a_tilde = ' + str(a_tilde[i])+ ' et b_tilde = ' + str(b_tilde[j]))
Coût quadratique : 88.1798520842  pour a_tilde = 6.2346103546e-07 et b_tilde = 6.24433188669
Coût quadratique : 27.5752572068  pour a_tilde = 6.2346103546e-07 et b_tilde = 7.02487337253
Coût quadratique : 2.3068729738  pour a_tilde = 6.2346103546e-07 et b_tilde = 7.80541485836
Coût quadratique : 12.3746993853  pour a_tilde = 6.2346103546e-07 et b_tilde = 8.5859563442
Coût quadratique : 57.7787364413  pour a_tilde = 6.2346103546e-07 et b_tilde = 9.36649783004
Coût quadratique : 79.9358653839  pour a_tilde = 7.01393664893e-07 et b_tilde = 6.24433188669
Coût quadratique : 23.1314099618  pour a_tilde = 7.01393664893e-07 et b_tilde = 7.02487337253
Coût quadratique : 1.66316518422  pour a_tilde = 7.01393664893e-07 et b_tilde = 7.80541485836
Coût quadratique : 15.5311310511  pour a_tilde = 7.01393664893e-07 et b_tilde = 8.5859563442
Coût quadratique : 64.7353075624  pour a_tilde = 7.01393664893e-07 et b_tilde = 9.36649783004
Coût quadratique : 72.12101721  pour a_tilde = 7.79326294325e-07 et b_tilde = 6.24433188669
Coût quadratique : 19.1167012433  pour a_tilde = 7.79326294325e-07 et b_tilde = 7.02487337253
Coût quadratique : 1.44859592103  pour a_tilde = 7.79326294325e-07 et b_tilde = 7.80541485836
Coût quadratique : 19.1167012433  pour a_tilde = 7.79326294325e-07 et b_tilde = 8.5859563442
Coût quadratique : 72.12101721  pour a_tilde = 7.79326294325e-07 et b_tilde = 9.36649783004
Coût quadratique : 64.7353075624  pour a_tilde = 8.57258923758e-07 et b_tilde = 6.24433188669
Coût quadratique : 15.5311310511  pour a_tilde = 8.57258923758e-07 et b_tilde = 7.02487337253
Coût quadratique : 1.66316518422  pour a_tilde = 8.57258923758e-07 et b_tilde = 7.80541485836
Coût quadratique : 23.1314099618  pour a_tilde = 8.57258923758e-07 et b_tilde = 8.5859563442
Coût quadratique : 79.9358653839  pour a_tilde = 8.57258923758e-07 et b_tilde = 9.36649783004
Coût quadratique : 57.7787364413  pour a_tilde = 9.3519155319e-07 et b_tilde = 6.24433188669
Coût quadratique : 12.3746993853  pour a_tilde = 9.3519155319e-07 et b_tilde = 7.02487337253
Coût quadratique : 2.3068729738  pour a_tilde = 9.3519155319e-07 et b_tilde = 7.80541485836
Coût quadratique : 27.5752572068  pour a_tilde = 9.3519155319e-07 et b_tilde = 8.5859563442
Coût quadratique : 88.1798520842  pour a_tilde = 9.3519155319e-07 et b_tilde = 9.36649783004


Coût absolu : 50.14  pour a_tilde = 6.2346103546e-07 et b_tilde = 6.24433188669
Coût absolu : 27.5042969107  pour a_tilde = 6.2346103546e-07 et b_tilde = 7.02487337253
Coût absolu : 6.82278118906  pour a_tilde = 6.2346103546e-07 et b_tilde = 7.80541485836
Coût absolu : 17.7671092678  pour a_tilde = 6.2346103546e-07 et b_tilde = 8.5859563442
Coût absolu : 40.402812357  pour a_tilde = 6.2346103546e-07 et b_tilde = 9.36649783004
Coût absolu : 47.7057030893  pour a_tilde = 7.01393664893e-07 et b_tilde = 6.24433188669
Coût absolu : 25.07  pour a_tilde = 7.01393664893e-07 et b_tilde = 7.02487337253
Coût absolu : 5.22139120063  pour a_tilde = 7.01393664893e-07 et b_tilde = 7.80541485836
Coût absolu : 20.2014061785  pour a_tilde = 7.01393664893e-07 et b_tilde = 8.5859563442
Coût absolu : 42.8371092678  pour a_tilde = 7.01393664893e-07 et b_tilde = 9.36649783004
Coût absolu : 45.2714061785  pour a_tilde = 7.79326294325e-07 et b_tilde = 6.24433188669
Coût absolu : 22.6357030893  pour a_tilde = 7.79326294325e-07 et b_tilde = 7.02487337253
Coût absolu : 4.56275351706  pour a_tilde = 7.79326294325e-07 et b_tilde = 7.80541485836
Coût absolu : 22.6357030893  pour a_tilde = 7.79326294325e-07 et b_tilde = 8.5859563442
Coût absolu : 45.2714061785  pour a_tilde = 7.79326294325e-07 et b_tilde = 9.36649783004
Coût absolu : 42.8371092678  pour a_tilde = 8.57258923758e-07 et b_tilde = 6.24433188669
Coût absolu : 20.2014061785  pour a_tilde = 8.57258923758e-07 et b_tilde = 7.02487337253
Coût absolu : 5.07056022604  pour a_tilde = 8.57258923758e-07 et b_tilde = 7.80541485836
Coût absolu : 25.07  pour a_tilde = 8.57258923758e-07 et b_tilde = 8.5859563442
Coût absolu : 47.7057030893  pour a_tilde = 8.57258923758e-07 et b_tilde = 9.36649783004
Coût absolu : 40.402812357  pour a_tilde = 9.3519155319e-07 et b_tilde = 6.24433188669
Coût absolu : 17.7671092678  pour a_tilde = 9.3519155319e-07 et b_tilde = 7.02487337253
Coût absolu : 6.57459275916  pour a_tilde = 9.3519155319e-07 et b_tilde = 7.80541485836
Coût absolu : 27.5042969107  pour a_tilde = 9.3519155319e-07 et b_tilde = 8.5859563442
Coût absolu : 50.14  pour a_tilde = 9.3519155319e-07 et b_tilde = 9.36649783004
In [ ]:
 
In [ ]:
 

Exercice sur les classes de fonction pour la régression

In [160]:
X = np.arange(3, 15, 0.2)
Y = np.sin(2*np.pi*X*0.3) + np.random.normal(0, 0.2, len(X))


plt.plot(X,Y, 'o')
plt.plot(X, np.sin(2*np.pi*X*0.3))
plt.xlabel('X')
plt.ylabel('Y')
plt.show()
In [161]:
X = np.arange(0, 15, 0.5)
Y = (X)**3 + np.random.normal(0, 200, len(X))


plt.plot(X,Y, 'o')
plt.plot(X, (X)**3)
plt.xlabel('X')
plt.ylabel('Y')
plt.show()
In [176]:
X = np.arange(3, 15, 0.5)
Y = 0.78*X + 0.90 + np.random.normal(0, 1.5, len(X))


plt.plot(X,Y, 'o')
plt.plot(X, 0.78*X + 0.90)
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Régression linéaire sur l'exemple ci-dessus

In [177]:
regr2 = linear_model.LinearRegression()
regr2.fit(X.reshape(-1, 1), Y.reshape(-1, 1))

a = regr2.coef_[0]
b = np.mean(Y) - a*np.mean(X)
print('Equation de la droite : y = '+str(a[0])+' x + ' + str(b[0]))

print(np.sum(X*(Y - np.mean(Y)))/np.sum(X*(X - np.mean(X))))

X_axis = np.arange(X.min(), X.max())[:, np.newaxis]
Y_pred = regr2.predict(X_axis)

plt.plot(X,Y, 'o')
plt.plot(X, 0.78*X + 0.90)
plt.plot(X_axis, Y_pred, 'navy')
plt.plot(X, a*X + b, 'red')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()
Equation de la droite : y = 0.664502204635 x + 1.78350846649
0.664502204635

Remarques : on peut faire varier le nombre de points ou la variance du bruit pour constater l'influence sur la qualité d'estimation de la régression linéaire

In [ ]: